import type { Next, Context } from 'koa';
import logger from '../utils/logger';

/**
 * 响应处理模块
 */
export default async function (ctx: Context, next: Next) {
    try {
        // 调用下一个 middleware
        await next();

        // 处理响应结果
        // 如果直接写入在 body 中，则不作处理
        // 如果写在 ctx.body 为空，则使用 state 作为响应
        ctx.body = ctx.body
            ? ctx.body
            : {
                  errno: ctx.state.errno || 0,
                  errmsg: ctx.state.errmsg || 'success',
                  data: ctx.state.data || undefined,
              };
    } catch (e: any) {
        // catch 住全局的错误信息
        if (e && e.message === 'ctx end') {
            logger.info('ctx end');
        } else {
            logger.warn('Catch Error: %o', e);
        }

        // 设置状态码为 200 - 服务端错误
        ctx.status = 200;

        // 输出详细的错误信息
        ctx.body = {
            errno: ctx.state.errno || 500,
            errmsg: ctx.state.errmsg || e,
        };
    }
}
